package edu.hubu.supermarketmanagementsystem.service.impl;

import cn.hutool.crypto.digest.DigestUtil;
import edu.hubu.supermarketmanagementsystem.entity.Admin;
import edu.hubu.supermarketmanagementsystem.mapper.CustomerMapper;
import edu.hubu.supermarketmanagementsystem.service.CustomerService;
import edu.hubu.supermarketmanagementsystem.entity.Customer;
import edu.hubu.supermarketmanagementsystem.vo.ResultVO;
import org.springframework.stereotype.Service;

@Service
public class CustomerServiceImpl implements CustomerService {

    private final CustomerMapper customerMapper;

    public CustomerServiceImpl(CustomerMapper customerMapper) {
        this.customerMapper = customerMapper;
    }

    /**
     * 用于注册顾客信息。
     *
     * @param username  顾客的用户名。
     * @param name      顾客的姓名。
     * @param password  顾客的密码。
     * @param email     顾客的电子邮箱地址。
     * @param telephone 顾客的电话号码。
     * @param address   顾客的邮寄地址。
     * @return 带有状态码、提示信息和数据的 ResultVO 实体。
     */
    @Override
    public <T> ResultVO<T> register(String username, String name, String password, String email, String telephone, String address, String role) {
        // 将用户信息封装到 Java Bean 中。
        Customer customer = new Customer();
        customer.setCustomerUsername(username);
        customer.setName(name);
        customer.setPassword(DigestUtil.sha256Hex(password));
        customer.setEmail(email);
        customer.setPhone(telephone);
        customer.setAddress(address);
        customer.setRole(role);

        if(customerMapper.insertCustomer(customer)>0){
            return new ResultVO<>(200, "注册成功", null);
        }
        else{
            return new ResultVO<>(500, "注册失败", null);
        }
    }

    /**
     * 用于获取顾客列表。
     *
     * @return 包含顾客列表的 ResultVO 实体。
     */
    @Override
    public ResultVO<Customer[]> getCustomersList() {
        Customer[] customers = customerMapper.getCustomersList();
        if (customers != null) {
            return new ResultVO<>(200, "获取顾客列表成功。", customers);
        }
        else {
            return new ResultVO<>(500, "不存在顾客。", null);
        }
    }

    /**
     * 更改用户的基本信息。
     *
     * @param id           待更改信息的用户ID。
     * @param newUsername  新用户名。
     * @param newName      新姓名。
     * @param newEmail     新电子邮件地址。
     * @param newTelephone 新电话号码。
     * @param newAddress   新收货地址。
     * @param newRole      新角色。
     * @return 如果成功则返回真，失败返回假。
     */
    @Override
    public <T> ResultVO<T> updateUser(Integer id, String newUsername, String newName, String newEmail, String newTelephone, String newAddress, String newRole) {
        // 将用户信息封装到 Java Bean 中。
        Customer customer = new Customer();
        customer.setCustomerId(id);
        customer.setCustomerUsername(newUsername);
        customer.setName(newName);
        customer.setEmail(newEmail);
        customer.setPhone(newTelephone);
        customer.setAddress(newAddress);
        customer.setRole(newRole);

        if(customerMapper.updateUser(customer) > 0){
            return new ResultVO<>(200, "更新成功。", null);
        }
        else {
            return new ResultVO<>(500, "更新失败", null);
        }
    }

    /**
     * 更改用户密码。
     *
     * @param id          待更改密码的用户ID。
     * @param newPassword 新密码。
     * @return 如果成功则返回真，失败返回假。
     */
    @Override
    public ResultVO<Boolean> updatePassword(Integer id, String newPassword) {
        if(customerMapper.updateUserPassword(id, DigestUtil.sha256Hex(newPassword)) > 0){
            return new ResultVO<>(200, "更新成功。", true);
        }
        else {
            return new ResultVO<>(500, "更新失败", false);
        }
    }

    /**
     * 删除用户。
     *
     * @param id 待删除用户的ID。
     * @return 如果成功则返回真，失败返回假。
     */
    @Override
    public ResultVO<Boolean> deleteUser(Integer id) {
        if (customerMapper.deleteUser(id) > 0) {
            return new ResultVO<>(200, "删除成功。", true);
        }
        else {
            return new ResultVO<>(500, "删除失败", false);
        }
    }
}
